package com.sh.learn.ibeifeng.webservice.axis;

import java.io.File;
import java.io.FileOutputStream;
import java.io.InputStream;
import javax.activation.DataHandler;
import javax.activation.FileDataSource;
import org.apache.commons.logging.Log;
import org.apache.commons.logging.LogFactory;

//<service name="FileService" provider="java:RPC">
//<parameter name="className" value="com.sh.learn.ibeifeng.webservice.axis.FileService" />
//<parameter name="allowedMethods" value="*" />
//<operation name="uploadFile" returnQname="returnqname" returnType="ns:DataHandler" xmlns:SchemaNS="http://www.w3.org/2001/XMLSchema">
//  <parameter name="dh" value="ns:DataHandler" />
//  <parameter name="name" value="SchemaNS:string" />
//</operation>
//<operation name="downloadFile" returnQname="returnqname" returnType="ns:DataHandler" xmlns:SchemaNS="http://www.w3.org/2001/XMLSchema">
//  <parameter name="name" value="SchemaNS:string" />
//</operation>
//<typeMapping 
//  deserializer="org.apache.axis.encoding.ser.JAFDataHandlerDeserializerFactory"
//	serializer="org.apache.axis.encoding.ser.JAFDataHandlerSerializerFactory"
//	type="java:javax.activation.DataHandler"
//	qname="ns:DataHandler"
//	xmlns:ns="DataHandler"
//	encodingStyle="http://schemas.xmlsoap.org/soap/encoding/">
//</typeMapping>
//</service>
public class FileService {

	// WS的文件的上传与下载的服务类
	Log log = LogFactory.getLog(FileService.class);
	// 创建一个基础路径，对应服务端tomcat的bin目录下
	public static String Reponsitory = "./files";

	// 创建的文件上传的方法
	public String uploadFile(DataHandler dh, String name) {
		// 判断上传时的文件名
		if (name == null) {
			name = "test.tmp";
		}
		log.info("name: " + name);
		try {
			// 上传的文件的路径是否存在
			File dir = new File(Reponsitory);
			if (!dir.exists()) {
				dir.mkdir();
				log.info("makedDir :dir " + dir);
			}
			// 获取上传文件的文件流
			InputStream input = dh.getInputStream();
			// 创建一个保存文件的输出流
			FileOutputStream fos = new FileOutputStream(new File(dir, name));
			// 创建一个缓冲区
			byte[] buffer = new byte[1024 * 4];
			// 读取文件的内容
			int n = 0;
			while ((n = input.read(buffer)) != -1) {
				fos.write(buffer, 0, n);
			}
			input.close();
			fos.close();
		} catch (Exception e) {
			e.printStackTrace();
		}
		return " File: " + name + "  send ok";

	}

	// 创建文件的下载的方法
	public DataHandler[] downloadFile(String name) {
		log.info("下载的文件名: " + name);
		File dir = new File(Reponsitory); // 指明文件的下载的目录
		if (!dir.exists()) {
			dir.mkdir();
		}
		if (name != null && !name.equals("")) { // 符合条件的文件的下载
			File data = new File(dir, name);
			if (data.exists()) {
				// 确保下载的目录和文件存在
				DataHandler[] handlers = new DataHandler[1]; // 每次使用一个传输器
				handlers[0] = new DataHandler(new FileDataSource(data)); // 将服务器端的文件,包装成数据对象,使用传输器进行传输
				log.info("handlers :" + handlers + "[" + handlers.length + "}'");
				return handlers; // 返回传输器
			} else {
				log.info("return : null");
				return null;
			}
		} else {
			// 出现下载的文件名,出现了错误
			File[] files = dir.listFiles();
			DataHandler[] handlers = new DataHandler[files.length]; // 准备下载文件夹中的所有的文件
			for (int i = 0; i < files.length; i++) {
				handlers[i] = new DataHandler(new FileDataSource(files[i])); // 为每一个文件创建下载的流
			}
			log.info("handlers :" + handlers + "[" + handlers.length + "}'");
			return handlers; // 返回传输器,返回的是多个文件的传输器对象
		}

	}

}
